"""
Groovy MCP Server

面向 groovy 软件的 MCP Server，提供 Groovy 命令行操作的封装。

MCP tools 列表：
- groovy_version: 获取 Groovy 版本信息
  参数：无
  返回：{"success": bool, "command": str, "exit_code": int, "stdout": str, "stderr": str}

- groovy_execute_script: 执行 Groovy 脚本文件
  参数：script_file (str): Groovy 脚本文件路径
  返回：{"success": bool, "command": str, "exit_code": int, "stdout": str, "stderr": str}

- groovy_evaluate_code: 直接执行 Groovy 代码片段
  参数：code (str): 要执行的 Groovy 代码
  返回：{"success": bool, "command": str, "exit_code": int, "stdout": str, "stderr": str}

- groovy_console: 启动交互式 Groovy 控制台
  参数：无
  返回：{"success": bool, "command": str, "exit_code": int, "stdout": str, "stderr": str}

- groovy_compile: 编译 Groovy 类文件
  参数：source_file (str): Groovy 源文件路径
  返回：{"success": bool, "command": str, "exit_code": int, "stdout": str, "stderr": str}
"""

from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
from typing import Dict, Any

mcp = FastMCP("Groovy MCP Server")

@mcp.tool()
def groovy_version() -> Dict[str, Any]:
    """获取 Groovy 版本信息
    
    返回:
        dict: 包含命令执行结果的字典，结构为：
            {
                "success": bool,      # 命令是否成功执行
                "command": str,       # 执行的完整命令
                "exit_code": int,     # 命令退出码
                "stdout": str,        # 标准输出内容
                "stderr": str         # 标准错误内容
            }
    """
    command = ["groovy", "--version"]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def groovy_execute_script(script_file: str) -> Dict[str, Any]:
    """执行 Groovy 脚本文件
    
    参数:
        script_file (str): Groovy 脚本文件路径
        
    返回:
        dict: 包含命令执行结果的字典，结构为：
            {
                "success": bool,      # 命令是否成功执行
                "command": str,       # 执行的完整命令
                "exit_code": int,     # 命令退出码
                "stdout": str,        # 标准输出内容
                "stderr": str         # 标准错误内容
            }
    """
    command = ["groovy", script_file]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def groovy_evaluate_code(code: str) -> Dict[str, Any]:
    """直接执行 Groovy 代码片段
    
    参数:
        code (str): 要执行的 Groovy 代码
        
    返回:
        dict: 包含命令执行结果的字典，结构为：
            {
                "success": bool,      # 命令是否成功执行
                "command": str,       # 执行的完整命令
                "exit_code": int,     # 命令退出码
                "stdout": str,        # 标准输出内容
                "stderr": str         # 标准错误内容
            }
    """
    command = ["groovy", "-e", code]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def groovy_console() -> Dict[str, Any]:
    """启动交互式 Groovy 控制台
    
    返回:
        dict: 包含命令执行结果的字典，结构为：
            {
                "success": bool,      # 命令是否成功执行
                "command": str,       # 执行的完整命令
                "exit_code": int,     # 命令退出码
                "stdout": str,        # 标准输出内容
                "stderr": str         # 标准错误内容
            }
    """
    command = ["groovysh"]
    result = subprocess.run(command, capture_output=True, text=True, timeout=5)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def groovy_compile(source_file: str) -> Dict[str, Any]:
    """编译 Groovy 类文件
    
    参数:
        source_file (str): Groovy 源文件路径
        
    返回:
        dict: 包含命令执行结果的字典，结构为：
            {
                "success": bool,      # 命令是否成功执行
                "command": str,       # 执行的完整命令
                "exit_code": int,     # 命令退出码
                "stdout": str,        # 标准输出内容
                "stderr": str         # 标准错误内容
            }
    """
    command = ["groovyc", source_file]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

if __name__ == "__main__":
    mcp.run()